package com.jd.platform.gobrs.client.handler;

import com.jd.platform.gobrs.client.callback.ValueModel;
import com.jd.platform.gobrs.client.gcache.LocalCache;

/**
 * @program: gobrs
 * @ClassName CommonCacheHandler
 * @description:
 * @author: sizegang
 * @create: 2022-01-09 01:47
 * @Version 1.0
 **/
public abstract class CommonCacheHandler implements CacheHandler {

    public abstract LocalCache getNonNullCache(String key);

    /**
     * 是否临近过期
     * 判断是否过期时间小于1秒，小于1秒的话也发送
     */
    public boolean isNearExpire(ValueModel valueModel) {

        if (valueModel == null) {
            return true;
        }
        return valueModel.getCreateTime() + valueModel.getDuration() - System.currentTimeMillis() <= 2000;
    }
    public void setValueDirectly(String key, Object value) {
        getNonNullCache(key).set(key, value);
    }

    /**
     * 从本地cafine中获取 如果存在则说明已经被缓存成热点key
     * 判断是否是热key。适用于只需要判断key，而不需要value的场景
     */
    public boolean isHot(String key) {
        return getValueSimple(key) != null;
    }

    /**
     * 此方法有三种情况
     * 1. 如果没有配置规则则返回null
     * 2. 如果配置了规则，当前key没有热， 则返回null
     * 3. 配置了规则 也热key了 则返回值
     */
    public ValueModel getValueSimple(String key) {
        Object object = getNonNullCache(key).get(key);
        if (object == null) {
            return null;
        }
        return (ValueModel) object;
    }

    public boolean doSetCache(String key, Object value) {
        if (isHot(key)) {
            ValueModel valueModel = getValueSimple(key);
            if (valueModel == null) {
                return false;
            }
            valueModel.setValue(value);
            return true;
        }
        return false;
    }

}
